<?php
/**
 * The Config Entrance
 * 
 * @package Config
 * @author Shuky
 * @since v1.0
 * @version $Id: Config.php 7 2010-04-03 10:12:48Z shuky $
 */
namespace SFramework;

class Config
{
    // 自身实例，以实现单件模式
    protected static $_instance = null;
    
    // 配置容器
    protected $_configs = array();
    
    
    /**
     * 获取实例
     * @return SFrame\Config
     */
	public static function getInstance()
	{
		if (null === self::$_instance) {
			self::$_instance = new self();
		}
		return self::$_instance;
	}
	
	
	/**
	 * 添加配置，如果键值已存在则覆盖
	 * @param string|array $config
	 */
	public function setConfig($config)
	{
		if (is_string($config)) {
		    if (is_file($config)) {
		    	$config = include_once $config;
		    } else {
		        throw new SException\Config('配置文件路径错误，文件不存在');
		    }
		}
		if (!is_array($config)) {
			throw new SException\Config('配置文件必须为数组');
		}
		foreach ($config as $key=>$value) {
		    if ($value != null) {
		    	$this->_configs[$key] = $value;
		    }
		}
	}
	
	
	/**
	 * 获取配置
	 * 通过指定字符形式的键值查找配置，如果参数为非字符形式，则容错返回所有配置
	 * @param string $key 配置数组键值
	 * @return array|string
	 */
	public function getConfig($key = null)
	{
	    if (is_string($key)) {
	        if (isset($this->_configs[$key])) {
	        	return $this->_configs[$key];
	        } else {
	            throw new SException\Config($key .':未找到相应的配置');
	        }
	    } else {
	        return $this->_configs;
	    }
	}
}
